/**
 * @Author       : Hejh(3010733382@qq.com)
 * @Version      : V1.0
 * @Date         : 2024-03-20 16:44:28
 * @Description  : 滑块验证码的工具类
 */

const path = require('path')
const gm = require('gm').subClass({ imageMagick: true })
const svgCaptcha = require('svg-captcha')

// 可以使用redis进行x偏移量的缓存
module.exports.getSlide = async () => {
  const width = 420
  const height = 250
  const fragmentSize = 50
  try {
    // 生成图片
    const filePath = getRandomPath()
    console.log(filePath)
    const x =
      (Math.floor(Math.random() * 1000) % (width - 2 * fragmentSize)) +
      fragmentSize
    const y = Math.floor(Math.random() * 1000) % (height - fragmentSize)
    const { image, fragment } = await createImage(
      filePath,
      width,
      height,
      fragmentSize,
      x,
      y
    )
    // 缓存记录
    return { x, msg: 'ok', data: { image, fragment, y } }
  } catch (err) {
    console.log(err)
    return { msg: '服务器错误:' + err, data: null }
  }
}

// 随机选取1-4.jpg图片
function getRandomPath() {
  const fileLength = 4
  const index = Math.floor(Math.random() * 1000) % fileLength
  return path.resolve(__dirname, `../static/images/${index + 1}.jpg`)
}

function createImage(filePath, w, h, s, x, y) {
  filePath = 'E:\\毕业设计\\后端\\hejh-wp-server\\src\\static\\images\\1.jpg'
  return new Promise((resolve, reject) => {
    const res = { image: '', fragment: '' }
    gm(filePath)
      .resize(w, h, '!')
      .fill('rgba(0,0,0,.5)')
      //绘制由坐标对、宽度和高度指定的矩形。
      .drawRectangle(x, y, x + s - 1, y + s - 1)
      .noProfile()
      .setFormat('JPEG')
      .toBuffer('JPEG', (err, buffer) => {
        console.log(buffer)
        if (err) {
          console.log(err)
          reject(err)
        }
        res.image = 'data:image/jpg;base64,' + buffer.toString('base64')
        gm(filePath)
          .resize(w, h, '!')
          .crop(s, s, x, y)
          .noProfile()
          .setFormat('jpeg')
          .toBuffer((err, buffer) => {
            if (err) {
              reject(err)
            }
            res.fragment = 'data:image/jpg;base64,' + buffer.toString('base64')
            resolve(res)
          })
      })
  })
}

/**
 * @author: Hejh(3010733382@qq.com)
 * @description: 获取计算类验证码
 */
module.exports.getMathValidCode = async () => {
  const cap = svgCaptcha.createMathExpr({
    size: 4, // 验证码长度
    width: 160,
    height: 40,
    fontSize: 50,
    ignoreChars: '0oO1ilI', // 验证码字符中排除 0o1i
    noise: 2, // 干扰线条的数量
    color: true, // 验证码的字符是否有颜色，默认没有，如果设定了背景，则默认有
    background: '#eee' // 验证码图片背景颜色
  })
  let img = cap.data // 验证码
  var text = cap.text.toLowerCase() // 验证码字符，忽略大小写
  return { text, img }
}
